package cn.yougou.common;


import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.data.redis.core.ValueOperations;
import org.springframework.stereotype.Component;

import javax.annotation.Resource;
import java.util.List;
import java.util.concurrent.TimeUnit;

/**
 * RedisAPI
 *
 * @author kups
 * @since 2020-12-2
 */

@Slf4j
@Component
public class RedisUtils {

    @Autowired
    private StringRedisTemplate redisTemplate;

    /**
     * stringRedisTemplate.boundValueOps("test").increment(-1);//val做-1操作
     * stringRedisTemplate.boundValueOps("test").increment(1);//val +1
     */


    /**
     * 添加数据到 redis
     * 单位为秒
     */
    public void set(String key, String value, long timeout) throws Exception {
        redisTemplate.opsForValue().set(key, value, timeout, TimeUnit.SECONDS);
    }


    /**
     * 根据key 修改value 原剩余时间不变
     * 执行此操作时剩余时间会有延时（可忽略）
     */
    public void update(String key, String value)throws Exception  {
        long tim = ttl(key);//查询剩余时间
            if(tim==-2)return;//不操作
            delete(key);//删除原 key
            set(key, value, tim);//插入新
    }


    /**
     * 设置key的有效时长
     */
    public void set(String key, int seconds) throws Exception {

        redisTemplate.expire(key, seconds, TimeUnit.MILLISECONDS);
    }

    /**
     * 判断某个key是否存在
     */
    public boolean exist(String key) {
        try {
            return redisTemplate.hasKey(key);
        } catch (Exception e) {
            return false;
        }
    }

    /**
     * 获取数据
     *
     * @param key
     * @return
     */
    public String get(String key) throws Exception {
        return redisTemplate.opsForValue().get(key);
    }


    /**
     * 根据key获取过期时间并换算成指定单位
     * <p>
     * -2 不存在
     * -1 无限制
     * @param key
     * @return 剩余多少秒
     */
    public Long ttl(String key) throws Exception {
        return redisTemplate.getExpire(key, TimeUnit.SECONDS);
    }

    /**
     * 删除
     */
    public void delete(String key) throws Exception {
        redisTemplate.delete(key);
    }

    /**
     * 批量删除key
     */
    public void delete(List<String> key) throws Exception {
        redisTemplate.delete(key);
    }


    /**
     * 设置过期时间
     */
    public Boolean expire(String key, long timeout, TimeUnit unit) throws Exception {
        return redisTemplate.expire(key, timeout, unit);
    }

    /**
     * 将值 value 关联到 key ，并将 key 的过期时间设为 timeout
     *
     * @param timeout 过期时间
     * @param unit    时间单位, 天:TimeUnit.DAYS 小时:TimeUnit.HOURS 分钟:TimeUnit.MINUTES
     *                秒:TimeUnit.SECONDS 毫秒:TimeUnit.MILLISECONDS
     */
    public void setEx(String key, String value, long timeout, TimeUnit unit) throws Exception {
        redisTemplate.opsForValue().set(key, value, timeout, unit);
    }

    /**
     * 追加到末尾
     *
     * @param key
     * @param value
     * @return
     */
    public Integer append(String key, String value) throws Exception {
        return redisTemplate.opsForValue().append(key, value);
    }


}
